package net.lzzy.practices.repositories;

import net.lzzy.practices.entities.User;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.UUID;

public interface UserRepository extends JpaRepository<User, UUID> {
    /**
     * 使用用户和密码到数据库匹配符合条件的记录
     * @param username
     * @param password
     * @return user表返回的记录包装成java对象
     */
    User findUserByUserNameAndPassword(String username, String password);

    /**
     * 查找符合条件的记录数，用于注册时判断用户是否已被注册
     * @param username
     * @return
     */
    Integer countByUserName(String username);

    UserProjection getUserByUserName(String username);

    /**
     *
     * @param username
     * @return
     */
    List<UserProjection> getUsersByUserName(String username);

    /**
     * 根据时间倒序列出所有用户
     * @return
     */
    List<User> findAllByOrderByUpdateTimeDesc();


    /**
     * 根据时间倒序列出所有用户
     * @return pageable 分页参数，包括页码每页大小
     */
    List<User> findAllByOrderByUpdateTimeDesc(Pageable pageable);


    /**
     *
     * @return
     */
    Integer countAllBy();


    /**
     *
     * @param apply
     * @return
     */
    List<User> findUserByApplyTeacherOrderByUpdateTimeDesc(PageRequest apply);

    /**
     * 使用Query注解可进行自定义查询，而不限于方法名的约定
     * 1.注解2.添加参数kw表示方法参数使用japl语句，与sql基本一致，表名和列名为实体类及字段名
     * 3.参数绑定kw是占位符需要在方法参数中使用@PARAM注解 将方法与占位符绑定
     * @param keyword
     * @return
     */
    @Query("select u from User u where u.userName like concat('%',: kw , '%') or u.nickName " +
            "like concat('%',: kw , '%') or u.phone like concat('%',: kw , '%') or u.email like concat('%',: kw , '%')")
    List<User> findByQuery(@Param("kw") String keyword);


}
